
from crewai import Agent, Task, Crew, Process
from textbook_expert.service.JsonService import JsonService
from textbook_expert.service.TextbookService import TextbookService
from textbook_expert.service.QuizService import QuizService

# 创建 Agent
# agent = Agent(role="管理学教授", goal="解析管理学内容", backstory="管理学教科书专家，有多年的教学经验")
kb_extract_agent = Agent(role="管理学知识提取者", 
              goal="准确识别并结构化整理章节中的关键知识点、定义、模型、理论和重要术语，以便下游任务（如题目生成）使用。", 
              backstory="帮助教育者和学习者快速抓住教材的精髓。它掌握了大量管理学知识，能够精准提炼复杂文本中的关键概念，促进高效学习与知识迁移。")
question_gen_agent = Agent(role="题目生成", 
              goal="根据关键知识点生成高质量、清晰、有区分度的单项选择题，用于测试学习者对概念的理解。", 
              backstory="由教学测评专家设计，拥有多年在线教育经验，擅长设计合理、富有思维挑战性的题目，涵盖基础记忆、理解到应用的不同认知层级。")

# 创建 Task
kb_extract_task = Task(
    description="""以下是该章节的信息和信息：章节：{chapter_title}，小节：{section_title}，子小节: {subsection_title}, 子小节内容：{content}。 
        分析其结构和重点，输出一组清晰、准确、去冗余的关键知识点列表。每个知识点需包括简洁的描述，并尽可能涵盖定义、理论框架或应用情境。
    """,
    agent=kb_extract_agent,
    expected_output="以人说话的方式进行自然的表达"
)

question_gen_task = Task(
    description="""
    以下是该章节的信息和信息：章节：{chapter_title}，小节：{section_title}，子小节: {subsection_title}, 子小节内容：{content}
    基于每个知识点设计{quiz_count}道单项选择题，题型应清晰、有区分度，选项应具有迷惑性，正确答案应有明确的解释。题目尽量采用原文中的表述，以保证准确性。不要过度加工，以免改变原意。
    """,
    agent=question_gen_agent,
    expected_output="""
    根据提供的内容生成单项选择题，期望的格式如下：
        [
        {
            "question": "组织中个体的两个最基本的特征是",
            "options": ["知识和目标。", "情感和思维方式。", "行为和学习", "方向与强度。"],
            "correctAnswerIndex": 3,
            "explanation": "行为和学习是组织生活中个体的两个最基本的特征。其中，行为关系到现阶段的企业状态，学习则更多地对将来的企业发展起影响作用。通过现时的行为，可以促进成员的学习，学习的结果又会提高未来的行为能力，二者相互促进。"
        }]
        """
)   

# 组建 Crew 并执行任务
crew = Crew(
    agents=[question_gen_agent],
    tasks=[question_gen_task],
    process=Process.sequential,
    verbose=True,
 )

import json

if __name__ == "__main__":
    file_path = "/Users/martinzhang/mt-20230221/zxjd-proj-20240405/04-development/smart-learn-go/textbook_expert/resources/02-company_strategy.json"
    textbookService = TextbookService(file_path=file_path)
    quizService = QuizService()
    # quizService.add_quiz_json({},[])
     
    chs = textbookService.get_all_chapters()
    for chapter in chs:
        chapter_title = chapter['title']
        if chapter_title != '第七章战略控制与组织结构':
            continue
        sections = chapter.get('sections', [])
        for section in sections:
            for sub_section in section.get('subsections', []):
                if '思考题' in sub_section['title']:
                    continue
                content = sub_section.get('content', '')
                content_length = len(content)
                quiz_count = max(2, min(15, content_length // 100))
                input = {
                         "book_title": "企业战略管理",
                         "chapter_title": chapter_title, 
                         "section_title": section['title'], 
                         "subsection_title": sub_section['title'],
                         'subsection_number': sub_section['subsection_number'],
                         "content": content,
                         "quiz_count": quiz_count
                         }
                result = crew.kickoff(input)
                quizzes = result.raw
                # quizzes = json.loads(result) 
                del input['content']
                del input['quiz_count']
                quizService.add_quiz_json(input, quizzes)
                # print('result')
    print("DONE")
